home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1997 February / EnigmA AMIGA RUN 15 (1997)(G.R. Edizioni)(IT)[!][issue 1997-02][PLANET CD V].iso / enigma / earcd / varie / uae-0_64.lha / uae-0.6.4 / src / zfile.c < prev   
C/C++ Source or Header  |  1996-07-23  |  3KB  |  182 lines

  1.  /*
  2.   * UAE - The Un*x Amiga Emulator
  3.   *
  4.   * routines to handle compressed file automatically
  5.   *
  6.   * (c) 1996 Samuel Devulder
  7.   */
  8.  
  9. #include "sysconfig.h"
  10. #include "sysdeps.h"
  11.  
  12. #include "config.h"
  13. #include "options.h"
  14. #include "zfile.h"
  15.  
  16. #ifdef USE_ZFILE
  17.  
  18. static struct zfile
  19. {
  20.   struct zfile *next;
  21.   FILE *f;
  22.   char name[L_tmpnam];
  23. } *zlist;
  24.  
  25. /*
  26.  * called on exit()
  27.  */
  28. void zfile_exit(void)
  29. {
  30.   struct zfile *l;
  31.  
  32.   while((l = zlist))
  33.     {
  34.       zlist = l->next;
  35.       fclose(l->f);
  36.       free(l);
  37.     }
  38. }
  39.  
  40. /*
  41.  * fclose() but for a compressed file
  42.  */
  43. int zfile_close(FILE *f)
  44. {
  45.   struct zfile *pl = NULL,
  46.                *l  = zlist;
  47.   int ret;
  48.  
  49.   while(l && l->f!=f) {pl = l;l=l->next;}
  50.   if(!l) return fclose(f);
  51.   ret = fclose(l->f);
  52.  
  53.   if(!pl) zlist = l->next;
  54.   else pl->next = l->next;
  55.   free(l);
  56.  
  57.   return ret;
  58. }
  59.  
  60. /*
  61.  * gzip decompression
  62.  */
  63. static int gunzip(char *src,char *dst)
  64. {
  65.   char cmd[1024];
  66.   if(!dst) return 1;
  67.   sprintf(cmd,"gzip -d -c %s >%s",src,dst);
  68.   return !system(cmd);
  69. }
  70.  
  71. /*
  72.  * lha decompression
  73.  */
  74. static int lha(char *src,char *dst)
  75. {
  76.   char cmd[1024];
  77.   if(!dst) return 1;
  78.   sprintf(cmd,"lha -q -N p %s >%s",src,dst);
  79.   return !system(cmd);
  80. }
  81.  
  82. /*
  83.  * decompresses the file (or check if dest is null)
  84.  */
  85. static int uncompress(char *name,char *dest)
  86. {
  87.     char *ext = strrchr(name, '.');
  88.     char nam[1024];
  89.  
  90.     if (ext != NULL && access(name,0) >= 0) {
  91.     ext++;
  92.     if(!strcmp(ext,"z")  ||
  93.        !strcmp(ext,"Z")  ||
  94.        !strcmp(ext,"gz") ||
  95.        !strcmp(ext,"GZ") ||
  96.        0) return gunzip(name,dest);
  97.     if(!strcmp(ext,"lha") ||
  98.        !strcmp(ext,"LHA") ||
  99.        !strcmp(ext,"lzh") ||
  100.        !strcmp(ext,"LZH") ||
  101.        0) return lha(name,dest);
  102.     }
  103.  
  104.     if(access(strcat(strcpy(nam,name),".z"),0)>=0  ||
  105.        access(strcat(strcpy(nam,name),".Z"),0)>=0  ||
  106.        access(strcat(strcpy(nam,name),".gz"),0)>=0 ||
  107.        access(strcat(strcpy(nam,name),".GZ"),0)>=0 ||
  108.        0) return gunzip(nam,dest);
  109.  
  110.     if(access(strcat(strcpy(nam,name),".lha"),0)>=0 ||
  111.        access(strcat(strcpy(nam,name),".LHA"),0)>=0 ||
  112.        access(strcat(strcpy(nam,name),".lzh"),0)>=0 ||
  113.        access(strcat(strcpy(nam,name),".LZH"),0)>=0 ||
  114.        0) return lha(nam,dest);
  115.  
  116.     return 0;
  117. }
  118.  
  119. /*
  120.  * fopen() for a compressed file
  121.  */
  122. FILE *zfile_open(char *name,char *mode)
  123. {
  124.     struct zfile *l;
  125.     int fd;
  126.     
  127.     if(!uncompress(name,NULL)) return fopen(name,mode);
  128.     
  129.     if(!(l = malloc(sizeof(*l)))) return NULL;
  130.  
  131.     tmpnam(l->name);
  132.     fd = creat(l->name, 0666);
  133.     if (fd < 0)
  134.     return NULL;
  135.     
  136.     if(!uncompress(name,l->name)) 
  137.     {
  138.     free(l); close (fd); unlink(l->name); return NULL; 
  139.     }
  140.  
  141.     l->f=fopen(l->name,mode);
  142.     
  143.     /* Deleting the file now will cause the space for it to be freed
  144.      * as soon as we fclose() it. This saves bookkeeping work.
  145.      */
  146.     unlink (l->name);
  147.  
  148.     close (fd);
  149.     
  150.     if (l->f == NULL) {
  151.     free(l);
  152.     return NULL;
  153.     }
  154.  
  155.     l->next = zlist;
  156.     zlist   = l;
  157.  
  158.     return l->f;
  159. }
  160.  
  161. #else
  162.  
  163. /*
  164.  * Stubs for machines that this doesn't work on.
  165.  */
  166.  
  167. void zfile_exit(void)
  168. {
  169. }
  170.  
  171. int zfile_close(FILE *f)
  172. {
  173.     return fclose(f);
  174. }
  175.  
  176. FILE *zfile_open(char *name,char *mode)
  177. {
  178.     return fopen(name, mode);
  179. }
  180.  
  181. #endif
  182.